/**
 * axios 封装 
 */
import axios from "axios";
import {
	Toast,
	Dialog
} from "vant";
import router from "@/router";

//导入本地存储方法
import {
	getTokenLocal,
	removeTokenLocal
} from "@/utils/auth.js"

// 创建一个 axios 实例
const service = axios.create({
	withCredentials: true, // send cookies when cross-domain requests
	baseURL: process.env.VUE_APP_APIDOMAINNAME,
	timeout: 5000, // 设定响应超时
});

/**
 * 请求拦截器
 * 每次请求前，如果存在token则在请求头中携带token，显示loading
 */
service.interceptors.request.use((config) => {
	//如果本地有Token(用户已登录），让Axios携带这个Token，在header.authorization
	const token = getTokenLocal();
	if (token)
		config.headers.Authorization = token;

	// 在发送请求之前做些什么  
	Toast.loading('加载中...'); // 显示loading 
	return config;
}, (error) => {
	Toast.clear(); // 隐藏loading
	// 对请求错误做些什么    
	console.log(error);
	return Promise.reject(error);
});

/**
 * 响应拦截器，
 * 每次响应的格式
 * { code => 状态码, msg => '响应信息', data => 数据 }
 */
service.interceptors.response.use((response) => {
	Toast.clear(); // 隐藏loading
	const result = response.data; //注意后端返回的数据格式 result = { code msg data } 
	if (result.code == 1) { //注意返回的code值的含义  success
		return Promise.resolve(result); //返回成功  
	} else {
		// 如果Token错误（用户没登录 或 Token过期）		
		if (result.code === 401) {
			Dialog.confirm({
				title: "要重新登录吗?",
				message: result.msg,
			}).then(() => {
				removeTokenLocal(); //清除本地保存的Token	

				//跳转到 Login ,并传递参数（登录后返回的路径)
				router.push({
					name: 'login',
					params: {
						redirect: router.currentRoute.path
					}
				});
			}).catch(() => {
				//路由跳转到首页
				router.push({
					name: "home"
				});
			});
		} else {
			Dialog.alert({
				title: "响应错误",
				message: result.msg
			});
		}

		return Promise.reject(new Error(result.msg || "未知的响应错误"));

	}
}, (error) => {
	//控制台错误提示
	console.error("响应出错:" + error); // for debug    
	Toast.clear(); // 隐藏loading

	// 全局错误提示    
	Dialog.alert({
		title: "响应拦截器错误",
		message: error.message
	});
	return Promise.reject(error);
});

//默认引出
export default service;
